extends Node
#存档文件
const 存档文件="user://test_save.tres"

var 世界时间:世界时间类
var 世界数据:世界数据类

#region 全局卡牌
var 当前位置卡牌:卡牌堆类
var 当前互动卡牌:卡牌堆类:
	set(value):
		当前互动卡牌=value
		if 当前互动卡牌!=null:
			显示拖入信息()
		else:
			GameViewManager.关闭提示信息()
var 手上卡牌:卡牌数据类:
	set(value):
		手上卡牌=value
		if 手上卡牌!=null:
			显示拖拽状态()
		else:
			恢复正常状态()			
#endregion 

func 执行语句(执行者,语句:String):
	var ex=Expression.new()
	ex.parse(语句)
	return ex.execute([],执行者)			
			
#region 游戏保存载入
func 开始新游戏():
	世界时间=世界时间类.new(270)
	世界数据=GameFactory.生成数据模型("世界","热带岛屿")
	
func 载入游戏():
	世界数据=ResourceLoader.load(存档文件).duplicate(true)
	世界时间=世界数据.世界时间

func 保存游戏():
	ResourceSaver.save(世界数据,存档文件)
#endregion

#region 拖拽状态和信息提示
func 显示拖拽状态():
	设置鼠标为拖拽显示()
	get_tree().call_group("卡牌堆组","显示拖入状态",GameCode.手上卡牌)
	GameViewManager.添加手上卡牌(GameCode.手上卡牌)
	
func 恢复正常状态():
	设置鼠标为正常显示()
	get_tree().call_group("卡牌堆组","恢复正常显示")
	GameViewManager.移除手上卡牌()	
	
func 设置鼠标为拖拽显示():
	var custom_cursor = load("res://素材/鼠标/gauntlet_grabby_cursor.png")
	Input.set_custom_mouse_cursor(custom_cursor, Input.CURSOR_ARROW)

func 设置鼠标为正常显示():
	var custom_cursor = load("res://素材/鼠标/gauntlet_pointy_cursor.png")
	Input.set_custom_mouse_cursor(custom_cursor, Input.CURSOR_ARROW)
	
func 显示拖入信息():
	var 拖入动作=当前互动卡牌.获取可拖入动作(手上卡牌)
	if 拖入动作!=null:
		var 动作耗时="耗时:"+str(拖入动作.耗时)+"分钟"
		GameViewManager.显示提示信息(拖入动作.动作名,动作耗时)		
#endregion

#region 执行松开操作
func 执行当前拖入动作():
	var 拖入动作=当前互动卡牌.获取可拖入动作(手上卡牌)
	if 拖入动作!=null:
		手上卡牌.回到所有者()	
		拖入动作.执行动作(手上卡牌)
		手上卡牌=null
	else:
		执行右插入操作()
		
func 执行左插入操作():
	var 当前区=当前位置卡牌.卡牌堆数据.所在区
	if 手上卡牌.所在堆.所在区==当前区: 
		手上卡牌.回到所有者()
		if 手上卡牌.所在堆!=当前位置卡牌.卡牌堆数据:
			print("卡牌堆插入位置")
			当前区.移动到卡牌堆左侧(手上卡牌,当前位置卡牌.卡牌堆数据)
		手上卡牌=null
	else:
		print("将手上卡牌移入位置")
		手上卡牌.所在堆.有卡牌被拽起=false
		var 卡牌堆数据=当前位置卡牌.卡牌堆数据
		手上卡牌=当前区.插入到卡牌堆左侧(手上卡牌,当前位置卡牌.卡牌堆数据)
	
func 执行右插入操作():
	var 当前区=当前位置卡牌.卡牌堆数据.所在区
	if 手上卡牌.所在堆.所在区==当前区: 
		手上卡牌.回到所有者()
		if 手上卡牌.所在堆!=当前位置卡牌.卡牌堆数据:
			print("卡牌堆插入位置")
			当前区.移动到卡牌堆右侧(手上卡牌,当前位置卡牌.卡牌堆数据)
		手上卡牌=null
	else:
		print("将手上卡牌移入位置")
		手上卡牌.所在堆.有卡牌被拽起=false
		var 卡牌堆数据=当前位置卡牌.卡牌堆数据
		手上卡牌=当前区.插入到卡牌堆右侧(手上卡牌,当前位置卡牌.卡牌堆数据)

func 执行松开操作():
	if 手上卡牌!=null and 当前位置卡牌!=null:
		var 当前区=当前位置卡牌.卡牌堆数据.所在区
		if 当前位置卡牌.状态=="中间停留":
			print("中间停留")
			if 当前位置卡牌 is 手牌区卡牌堆类 and 当前位置卡牌.卡牌堆为空():
				if 当前位置卡牌.卡牌堆数据.所在区==手上卡牌.所在堆.所在区:
					当前区.移动到卡牌堆(手上卡牌,当前位置卡牌.卡牌堆数据)
				else:
					当前区.设置到卡牌堆(手上卡牌,当前位置卡牌.卡牌堆数据)
				手上卡牌.所在堆.有卡牌被拽起=false
				手上卡牌=null				
			else:
				执行当前拖入动作()
		elif 当前位置卡牌.状态=="左插入":
			print("左插入")
			执行左插入操作()
		elif 当前位置卡牌.状态=="右插入":
			执行右插入操作()
			print("右插入")
			
	if 手上卡牌!=null:
		手上卡牌.回到所有者()
		手上卡牌=null	
	if 当前位置卡牌!=null:
		当前位置卡牌.切换状态("停留")
#endregion	
